package com.xinqi.modules.user.user.client;

import com.xinqi.common.base.constants.ServiceNameConstants;
import com.xinqi.common.base.response.R;
import com.xinqi.modules.user.user.dto.req.*;
import com.xinqi.modules.user.user.dto.rsp.SearchFriendResultDTO;
import com.xinqi.modules.user.user.dto.rsp.UserBaseInfoDO;
import com.xinqi.modules.user.user.dto.rsp.UserPasswordResultDTO;
import com.xinqi.modules.user.user.dto.rsp.UserResultDTO;
import com.xinqi.modules.user.user.factory.UserFallbackFactory;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * 用户表客户端
 *
 * @author: system
 * @date: 2023/01/17
 */
@FeignClient(contextId = "userClient", value = ServiceNameConstants.XQ_AUTH, fallbackFactory = UserFallbackFactory.class)
public interface UserClient {

    /**
     * 搜索好友
     *
     * @param dto
     * @return
     */
    @PostMapping("/inner/user/search")
    R<List<SearchFriendResultDTO>> search(@RequestBody SearchFriendDTO dto);

    /**
     * 用户列表
     *
     * @param dto
     * @return
     */
    @GetMapping("/inner/user/list")
    R<List<UserResultDTO>> list(UserQueryDTO dto);

    /**
     * 用户详情
     *
     * @param id
     * @return
     */
    @GetMapping("/inner/user/get/{userId}")
    R<UserResultDTO> findById(@PathVariable("userId") Long id);

    /**
     * 用户详情
     *
     * @param id
     * @return
     */
    @GetMapping("/inner/user/get-password/{userId}")
    R<UserPasswordResultDTO> findPasswordById(@PathVariable("userId") Long id);

    @PostMapping("/inner/user/findList")
    R<List<UserResultDTO>> findList(@RequestParam("userIds") List<Long> userIds);

    @PostMapping("/inner/user/findByMobile")
    R<List<UserResultDTO>> findByMobile(@RequestParam("mobileList") List<String> mobileList);

    @GetMapping("/inner/user/find-by-mobile")
    R<UserResultDTO> findByMobile(@RequestParam("mobile") String mobile);

    @GetMapping("/inner/user/user-account/contain/delete")
    R<List<UserBaseInfoDO>> getUserBaseInfoContainDelByMobile(@RequestParam(value = "mobile") String mobile);

    @GetMapping("/inner/user/find-imitate-by-mobile-and-nickname")
    R<UserResultDTO> findImitateByMobileAndNickname(@RequestParam("mobile") String mobile, @RequestParam("nickname") String nickname);

    /**
     * 查询用户基础
     *
     * @param userId 用户id
     * @return 用户基础信息
     */
    @GetMapping("/inner/user/user-account")
    R<UserBaseInfoDO> getUserBaseInfo(@RequestParam(value = "userId") Long userId);

    @PostMapping(value = "/inner/user/register")
    R<UserResultDTO> register(UserRegisterDTO register);

    /**
     * 账号封禁
     *
     * @param userIds
     * @return
     */
    @PostMapping("/inner/user/accountBan")
    R<Boolean> accountBan(@RequestParam("userIds") List<Long> userIds);

    /**
     * 账号解封
     *
     * @param userIds
     * @return
     */
    @PostMapping("/inner/user/accountUnblocking")
    R<Boolean> accountUnblocking(@RequestParam("userIds") List<Long> userIds);

    /**
     * 校验手机号码是否为新用户
     *
     * @param mobile
     * @return
     */
    @PostMapping("/inner/user/findByMobileIncludeDelete")
    R<Boolean> findByMobileIncludeDelete(@RequestParam("mobile") String mobile);

    /**
     * 注册新奇助手用户
     *
     * @return
     */
    @PostMapping("/inner/user/assistant/register")
    R<UserResultDTO> registerAssistant();

    /**
     * 注册模拟用户
     *
     * @param dto
     * @return
     */
    @PostMapping("/inner/user/imitate/register")
    R<UserResultDTO> imitateUser(@RequestBody UserImitateDTO dto);

    /**
     * 修改模拟用户
     *
     * @param dto 模拟用户dto
     * @return Boolean
     */
    @PostMapping("/inner/user/imitate/update")
    R<Boolean> imitateUserUpdate(@RequestBody UserImitateUpdateDTO dto);

    /**
     * 兼容旧版本强制更新
     * 添加临时 client
     * @param userId
     * @return
     */
    @GetMapping("/getInfo/{userId}")
    R<UserResultDTO> getInfo(@PathVariable("userId") Long userId);

}

